home *** CD-ROM | disk | FTP | other *** search
/ Aminet 28 / Aminet 28 (1998)(GTI - Schatztruhe)[!][Dec 1998].iso / Aminet / dev / c / qtools0.2-src.lha / src / libqdisplay / tables.c < prev    next >
Encoding:
C/C++ Source or Header  |  1998-07-15  |  4.1 KB  |  144 lines

  1. #define    LIBQDISPLAY_CORE
  2. #include "../include/libqdisplay.h"
  3.  
  4. float sinTable[MAX_ANGLE + 1], cosTable[MAX_ANGLE + 1];
  5.  
  6. /* pre-calculated sin/cos-tables */
  7. void InitSinCosTables(void)
  8. {
  9.   short int countFlow;
  10.   double piFlow;
  11.   float *sinFlow = &sinTable[MAX_ANGLE] + 1;
  12.   float *cosFlow = &cosTable[MAX_ANGLE] + 1;
  13.  
  14.   for (countFlow = MAX_ANGLE, piFlow = MAX_ANGLE * M_PI / 180; countFlow >= 0; countFlow--, piFlow -= M_PI / 180) {
  15.     *--sinFlow = sin(piFlow);
  16.     *--cosFlow = cos(piFlow);
  17.   }
  18. }
  19.  
  20. /* pre-calculated multiplication-tables */
  21. int multTMap[MAX_MULTX][MAX_MULTY];
  22. bool multDone = FALSE;
  23. int *multMuls = &multTMap[0][0];
  24. int *multRows = 0;
  25.  
  26. void InitMultTables(int width, int height)
  27. {
  28.   int *lmulTables;
  29.   short int i, j;
  30.   int maxX;
  31.  
  32.   if (!multDone) {
  33.     lmulTables = &multTMap[MAX_MULTX - 1][MAX_MULTY - 1] + 1;
  34.     maxX = (MAX_MULTX - 1) * (MAX_MULTY - 1);
  35.  
  36.     for (i = MAX_MULTX - 1; i >= 0; i--) {
  37.       int maxY = maxX;
  38.  
  39.       for (j = MAX_MULTY - 1; j >= 0; j--) {
  40.     *--lmulTables = maxY;
  41.     maxY -= (int)i;
  42.       }
  43.       maxX -= MAX_MULTY - 1;
  44.     }
  45.     multDone = TRUE;
  46.   }
  47.  
  48.   if (multRows)
  49.     tfree(multRows);
  50.   if ((multRows = (int *)tmalloc(sizeof(int) * (height + 1)))) {
  51.     lmulTables = multRows + height + 1;
  52.  
  53.     for (i = height, maxX = width * height * localDim.frameBPP; i >= 0; i--, maxX -= width * localDim.frameBPP)
  54.       *--lmulTables = maxX;
  55.   }
  56.   else
  57.     Error(failed_memoryunsize, "multiplication-tables");
  58. }
  59.  
  60. #ifdef    DRIVER_8BIT
  61. /* pre-calculated transparency-tables */
  62. unsigned char *waterTransparency;                /* 50 */
  63. unsigned char *slimeTransparency;                /* 75 */
  64. unsigned char *lavaTransparency;                /* 90 */
  65. unsigned char *preTransparency;                    /* do not calculate in the loop */
  66. #endif
  67.  
  68. /*
  69.  * Warping water.
  70.  * 
  71.  * tx = H_AMPL * sin(2.0 * PI * (y / V_PERIOD + t / T_PERIOD));
  72.  * ty = V_AMPL * cos(2.0 * PI * (x / H_PERIOD + t / T_PERIOD));
  73.  * 
  74.  * - amplitudes: H_AMPL and V_AMPL,
  75.  * - repetition periods: H_PERIOD and V_PERIOD,
  76.  * - time repetition period: T_PERIOD.
  77.  * 
  78.  * - Ex: a period(spacing) of 128 and an amplitude of 8:
  79.  * tx = 8.0 * sin(2.0 * PI * y / 128.0);
  80.  * ty = 8.0 * cos(2.0 * PI * x / 128.0);
  81.  */
  82. int skyMovementX1 = 0, skyMovementY1 = 0;
  83. int skyMovementX2 = 0, skyMovementY2 = 0;
  84.  
  85. #ifndef    FAST_WARP
  86. int swim_u[256], swim_v[256], swim_phase;
  87. #else
  88. int *swim_u, *swim_v, swim_phase;
  89. int swim_u0[WARP_X >> MIPMAP_0], swim_v0[WARP_X >> MIPMAP_0];
  90. int swim_u1[WARP_X >> MIPMAP_1], swim_v1[WARP_X >> MIPMAP_1];
  91. int swim_u2[WARP_X >> MIPMAP_2], swim_v2[WARP_X >> MIPMAP_2];
  92. int swim_u3[WARP_X >> MIPMAP_3], swim_v3[WARP_X >> MIPMAP_3];
  93. int *swim_um[MIPMAP_MAX] =
  94. {swim_u0, swim_u1, swim_u2, swim_u3};
  95. int *swim_vm[MIPMAP_MAX] =
  96. {swim_v0, swim_v1, swim_v2, swim_v3};
  97. #endif
  98. void updateTimings(void)
  99. {
  100.   short int i;
  101.  
  102.   swim_phase++;
  103. #ifndef    FAST_WARP
  104.   for (i = 0; i < 256; ++i) {
  105.     /*swim_u[i] = FLOAT_FIX(sin(((i >> 6) + (swim_phase >> 6)) * M_PI * 2.0) * 8.0); */
  106.     /*swim_v[i] = FLOAT_FIX(cos(((i >> 6) + (swim_phase >> 6)) * M_PI * 2.0) * 8.0); */
  107.     /*swim_u[i] = scalw(sin(((i + swim_phase) * .09817477)), 19); */
  108.     /*swim_v[i] = scalw(cos(((i + swim_phase) * .09817477)), 19); */
  109.     double val = (i + swim_phase) * .09817477;
  110.     int val_u = scalw(sin(val), 19);                /* * 524288; */
  111.     int val_v = scalw(cos(val), 19);                /* * 524288; */
  112.  
  113.     swim_u[i] = val_u;                        /* mip0 */
  114.     swim_v[i] = val_v;
  115.   }
  116. #else
  117.   for (i = 0; i < WARP_X; ++i) {
  118.     double val = (i + swim_phase) * .09817477;
  119.     int val_u = scalw(sin(val), 19);                /* * 524288; */
  120.     int val_v = scalw(cos(val), 19);                /* * 524288; */
  121.  
  122.     swim_u0[i] = val_u;                        /* mip0 */
  123.     swim_v0[i] = val_v;
  124.     if (!(i & ((1 << MIPMAP_1) - 1))) {
  125.       swim_u1[i >> MIPMAP_1] = val_u >> MIPMAP_1;        /* mip1 */
  126.       swim_v1[i >> MIPMAP_1] = val_v >> MIPMAP_1;
  127.       if (!(i & ((1 << MIPMAP_2) - 1))) {
  128.     swim_u2[i >> MIPMAP_2] = val_u >> MIPMAP_2;        /* mip2 */
  129.     swim_v2[i >> MIPMAP_2] = val_v >> MIPMAP_2;
  130.     if (!(i & ((1 << MIPMAP_3) - 1))) {
  131.       swim_u3[i >> MIPMAP_3] = val_u >> MIPMAP_3;        /* mip3 */
  132.       swim_v3[i >> MIPMAP_3] = val_v >> MIPMAP_3;
  133.     }
  134.       }
  135.     }
  136.   }
  137. #endif
  138.  
  139.   skyMovementX1 += 0x00000100;
  140.   skyMovementY1 += 0x00000001;
  141.   skyMovementX2 += 0x00000200;
  142.   skyMovementY2 += 0x00000002;
  143. }
  144.